/*
 * Consola.c
 *
 *  Created on: 10/10/2011
 *      Author: MadeyMaga
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include "Consola.h"
#include "nipc.h"
#include "Disco.h"
#include "config.h"
#include "pedidos.h"
#include "busqueda.h"

extern int 		pistaActual, sectorActual, discoid;
//extern t_log	*s_log;

int atenderConsola(int fd)
{
	int 		retval;
	nipcMessage msg;
	char		data[150];

	retval = nipc_recv(&msg, fd);

	if(msg.payloadLength)
	{
		memset(data, 0, sizeof(data));

		if(NULL != strchr(msg.payload, ')'))
			*strchr(msg.payload, ')') = '\0';

		strcpy(data, strchr(msg.payload, '(') + 1);
		free(msg.payload);
		msg.payloadLength = 0;
	}

	if(retval == NIPC_ERROR_NONE)
	{
		switch(atoi(msg.payloadID))
		{
			case CMD_INFO:
			/* info: Imprimirá en pantalla la posición actual del cabezal */

				posicionCabezal(fd);

			break;

			case CMD_CLEAN:
			/* clean <sector inicial> <sector final>: Limpia los sectores seteando a '\0' sus bytes,
			 * desde el sector inicial hasta el sector final, ambos inclusive.
			 */

				if('0' == data[0])
				{
					msg.payload = "-1";
					msg.payloadLength = strlen(msg.payload) + 1;
					nipc_send(&msg, fd);

				} else
					clean(fd, data);

			break;

			case CMD_TRACE:
			/* trace [lista sectores]: Dado una lista de sectores logicos (entre 1 y máximo 5),
			 * por cada uno imprime la información de planificación resultante de procesar
			 * dicho sector en formato: <n° de pista>: <n° de sector dentro de la pista>.
			 */

				if('0' == data[0])
				{
					msg.payload = "-1";
					msg.payloadLength = strlen(msg.payload) + 1;
					nipc_send(&msg, fd);

				} else
					infoSectores(fd, data);

			break;

			default:

			break;

		} /*switch msg.payloadDescriptor*/
	}/* if retval == NIPC_ERROR_NONE*/

	return 0;
}

int posicionCabezal(int fd)
{
	int				aux;
	char			buffer[40];
	nipcMessage 	msg;

	nipc_make(&msg, fd, '0', 0, NULL);

	memset(buffer, 0, sizeof(buffer));

	aux = sprintf(buffer, "El cabezal se encuentra en la pista %d, sector %d.", pistaActual, sectorActual);

	memcpy(msg.payload, buffer, aux);

	msg.payloadLength = strlen(msg.payload) + 1;

	nipc_send(&msg, fd);

	return 0;
}

/* clean(secInicial, secFianl) */
int clean(int fd, char *clusters)
{
	int				secInicial, secFinal, i;
	char 			*buffer = NULL, *tok;
	nipcMessage 	msg;

	nipc_make(&msg, discoid, '0', 0, NULL);

	/* Obtenemos los numeros de sectores */
	tok = strtok(buffer, ",");
	secInicial = atoi(tok);
	printf("Sector inicial %d \n", secInicial);
	tok = strtok(NULL, "\0");
	secFinal = atoi(tok);
	printf("Sector final %d \n", secFinal);

	/* Empezamos a setear los sectores a 0 */
	memset(buffer, 0, sizeof(buffer));

	for(i = secInicial; i < secFinal; i++)
	{
		agregarPedido(i, WRITE, P_CONSOLA, buffer, fd);
//		log_info(s_log, "Thread-Consola", "Message info: %s %d", "se realizo un pedido de escritura del sector", i);
	}

	return 0;
}

int infoSectores(int fd,char *data)
{
	char 	*tok;
	int 	i;

	tok = strtok(data, ",");

	for(i = 0; tok != NULL; i++)
	{
		agregarPedido(atoi(tok), CONSOLA, P_CONSOLA, NULL, fd);
//		log_info(s_log, "Thread-Consola", "Message info: %s %d", "se realizo un pedido del sector", i);
		tok = strtok(NULL, ",");
	}

	return 0;
}
